package dibujo;

import java.awt.Color;
import java.awt.Graphics;

import org.uc3m.ed.interfaz_grafica.ventana.VentanaPrincipal;

public class NodoDibujo {

	/**
	 * 
	 */
	private Graphics _grafico;
	
	/**
	 * 
	 */
	private int _posicionX;
	
	/**
	 * 
	 */
	private int _posicionY;
	
	/**
	 * 
	 */
	private int _anchoNodo;
	
	/**
	 * 
	 */
	private int _altoNodo;
	
	/**
	 * 
	 */
	private NodoDibujo _hijoDerecho;
	
	/**
	 * 
	 */
	private NodoDibujo _hijoIzquierdo;
	
	/**
	 * 
	 */
	private String _dato;
	
	/**
	 * 
	 */
	private int _distanciaHermanos;
	
	/**
	 * 
	 */
	private boolean _comprobado;
	
	/**
	 * @param grafico
	 * @param dato
	 */
	public NodoDibujo(Graphics grafico,String dato){
		_grafico=grafico;
		_anchoNodo=40;
		_altoNodo=40;
		_hijoDerecho=null;
		_hijoIzquierdo=null;
		_dato=dato;
		_comprobado=false;
	}
	
	/**
	 * 
	 */
	public void crearNodo()
	{
		try
		{
			crearFigura();
			crearDato();
			crearApuntamientoHijoDerecho();
			crearApuntamientoHijoIzquierdo();
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::Arbol_Binario::NodoDibujo ERROR::1\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::Arbol_Binario::NodoDibujo ERROR::2\n   Se ha producido un Error: "+e.toString());
		}
		
	}

	/**
	 * 
	 */
	private void crearApuntamientoHijoIzquierdo() {
		_grafico.setColor(new Color (142,45,67));
		if (_hijoIzquierdo!=null)
			_grafico.drawLine(_posicionX+(_anchoNodo/2),_posicionY+_altoNodo,_hijoIzquierdo.getPosicionX()+(_hijoIzquierdo.getAnchoNodo()/2),_hijoIzquierdo.getPosicionY());
	}
	
	/**
	 * 
	 */
	private void crearApuntamientoHijoDerecho() {
		_grafico.setColor(new Color (0,84,10));
		if (_hijoDerecho!=null)
			_grafico.drawLine(_posicionX+(_anchoNodo/2),_posicionY+_altoNodo,_hijoDerecho.getPosicionX()+(_hijoDerecho.getAnchoNodo()/2),_hijoDerecho.getPosicionY());
	}
	
	/**
	 * 
	 */
	private void crearDato() {	
		_grafico.setColor(Color.BLACK);
		_grafico.drawString(_dato,getXTextoDato(), getYTextoDato());
	}
	
	/**
	 * 
	 */
	private void crearFigura() {
		_grafico.setColor(new Color (87,107,149));
		_grafico.fillArc(_posicionX,_posicionY,_anchoNodo+1,_altoNodo+1,0,360);
		_grafico.setColor(Color.BLACK);
		_grafico.drawArc(_posicionX,_posicionY,_anchoNodo,_altoNodo,0 ,360);
		
	}
	
	/**
	 * @return
	 */
	public int getPosicionX() {
		return _posicionX;
	}
	
	/**
	 * @param posicionX
	 */
	public void setPosicionX(int posicionX) {
		_posicionX = posicionX;
	}
	
	/**
	 * @return
	 */
	public int getPosicionY() {
		return _posicionY;
	}
	
	/**
	 * @param posicionY
	 */
	public void setPosicionY(int posicionY) {
		_posicionY = posicionY;
	}
	
	/**
	 * @return
	 */
	public int getAnchoNodo() {
		return _anchoNodo;
	}
	
	/**
	 * @return
	 */
	public int getAltoNodo() {
		return _altoNodo;
	}

	
	/**
	 * @return
	 */
	private int getXTextoDato()
	{
		return (_anchoNodo/2)+_posicionX-3;
	}
	
	/**
	 * @return
	 */
	private int getYTextoDato()
	{
		return (_altoNodo/2)+_posicionY+5;
	}
	
	
	/**
	 * @param hijoDerecho
	 */
	public void setHijoDerecho(NodoDibujo hijoDerecho) {
		_hijoDerecho=hijoDerecho;
	}
	
	/**
	 * @param hijoIzquierdo
	 */
	public void setHijoIzquierdo(NodoDibujo hijoIzquierdo) {
		_hijoIzquierdo=hijoIzquierdo;
	}
	
	/**
	 * @return
	 */
	public NodoDibujo getHijoDerecho() {
		return _hijoDerecho;
	}
	
	/**
	 * @return
	 */
	public NodoDibujo getHijoIzquierdo() {
		return _hijoIzquierdo;
	}

	/**
	 * @return
	 */
	public int getDistancia() {
		
		return _distanciaHermanos;
	}

	/**
	 * @param distancia
	 */
	public void setDistancia(int distancia) {
		_distanciaHermanos=distancia;
		
	}
	
	/**
	 * @return
	 */
	public boolean getComprobado() {
		
		return _comprobado;
	}

	/**
	 * @param comprobado
	 */
	public void setComprobado(boolean comprobado) {
		_comprobado=comprobado;
		
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return _dato;
		
	}
	
}
